package main;

import java.util.Arrays;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;
import models.Memory_card;
import models.Memory_spel;

/**
 * ****************************************************************************
 * @author Tjarco
 *
 * De klasse om het Memory spel uit te voeren.
 * ****************************************************************************
 */
public class Memory_spel_run {

    Memory_spel gui;
    Memory_card[] kaarten;
    private boolean programRun;
    private boolean mainNext = true;
    private boolean tweeKaartenOpen = false;

    public boolean isMainNext() {
        return mainNext;
    }

    public void setMainNext(boolean mainNext) {
        this.mainNext = mainNext;
    }

    public void setProgramRun(boolean programRun) {
        this.programRun = programRun;
    }
   
    public Memory_spel_run() {
        gui = new Memory_spel();
        programRun = true;
        kaarten = new Memory_card[]{
            new Memory_card(0),
            new Memory_card(1),
            new Memory_card(2),
            new Memory_card(3),
            new Memory_card(4),
            new Memory_card(5),
            new Memory_card(6),
            new Memory_card(7),
            new Memory_card(8),
            new Memory_card(9),
            new Memory_card(10),
            new Memory_card(11),};
        Collections.shuffle(Arrays.asList(kaarten));

    }
    
    
   public boolean isProgramRun() {
        return programRun;
   }
   
// <editor-fold defaultstate="collapsed" desc=" Methode om de game te stoppen ">
    public void stopGame() {
        this.programRun = false;
        gui.setVisible(false);
        try {
            this.finalize();
        } catch (Throwable ex) {
            Logger.getLogger(Memory_spel_run.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

// </editor-fold>
    
// <editor-fold defaultstate="collapsed" desc=" voert de methoden uit om het spel te controleren ">
    public void run(Main m) {
        gui.setVisible(true);
        if(!this.programRun){
            this.programRun=true;
        }
 
        while (this.programRun) {
            this.alleKaartenWeg();
            this.kaartGeklikt();
            this.tweeKaartenOpen();
            
           
            
            if(gui.isButtonBackPressed()){
                this.programRun=false;
                gui.setVisible(false);
                gui.setButtonBackPressed(false);
                try {
                    this.finalize();
                } catch (Throwable ex) {
                    Logger.getLogger(Memory_spel_run.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            
            
            
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                Logger.getLogger(Memory_spel_run.class.getName()).log(Level.SEVERE, null, ex);
            }
            
             //m.checkPlayState();
        }
        
    }

// </editor-fold>
    
// <editor-fold defaultstate="collapsed" desc=" check of er twee kaarten open zijn ">
    public void tweeKaartenOpen() {
        int counter = 0;
        int index1 = -1;
        int index2 = -1;
        for (int i = 0; i < kaarten.length; i++) {
            if (kaarten[i].testIsActive()) {
                counter++;
                if (index1 == -1) {
                    index1 = i;
                } else {
                    index2 = i;
                }
            }
        }
        
        if (counter == 2) {
            this.tweeKaartenOpen=true;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Memory_spel_run.class.getName()).log(Level.SEVERE, null, ex);
            }
            this.tweeDezelfdeKaarten();
            kaarten[index1].setInactive();
            kaarten[index2].setInactive();
            this.tweeKaartenOpen=false;
            gui.setPogingen(gui.getPogingen()+1);
            gui.showStatusBar("attempts: " + gui.getPogingen());
            this.refreshIcons();
        }
    }

// </editor-fold>
    
// <editor-fold defaultstate="collapsed" desc=" Test of twee kaarten hetzelfde zijn ">
    public void tweeDezelfdeKaarten() {
        int kaart1 = -1;
        int index1 = 0;
        int kaart2 = -1;
        int index2 = 0;
        for (int i = 0; i < kaarten.length; i++) {
            //Als de kaart met index i actief is:
            //  1.Kijk of de kaart de eerste of de tweede actieve kaart is
            //  2.onthoudt de soort van de kaart, en de index van waar de kaart zich bevind in de array
            
            if (kaarten[i].testIsActive()) {
                
                if (kaart1 == -1) {
                    kaart1 = kaarten[i].getSoort();
                    index1 = i;
                    
                } else {
                    kaart2 = kaarten[i].getSoort();
                    index2 = i;
                }
            }
        }
        //Vergelijk of de kaarten bij elkaar horen. is dit het geval, verwijder de kaarten dan.
        switch(kaart1){
            case 0: if(kaart2==1)verwijderKaarten(index1,index2);break;
            case 1: if(kaart2==0)verwijderKaarten(index1,index2);break;
            case 2: if(kaart2==3)verwijderKaarten(index1,index2);break;
            case 3: if(kaart2==2)verwijderKaarten(index1,index2);break;
            case 4: if(kaart2==5)verwijderKaarten(index1,index2);break;
            case 5: if(kaart2==4)verwijderKaarten(index1,index2);break;
            case 6: if(kaart2==7)verwijderKaarten(index1,index2);break;
            case 7: if(kaart2==6)verwijderKaarten(index1,index2);break;
            case 8: if(kaart2==9)verwijderKaarten(index1,index2);break;    
            case 9: if(kaart2==8)verwijderKaarten(index1,index2);break;
            case 10: if(kaart2==11)verwijderKaarten(index1,index2);break;
            case 11: if(kaart2==10)verwijderKaarten(index1,index2);break;
        
        }
    }
    
    private void verwijderKaarten(int index1, int index2){
        kaarten[index1].verwijderKaart();
        kaarten[index2].verwijderKaart();
    }

// </editor-fold>

// <editor-fold defaultstate="collapsed" desc=" kijk of er op kaarten geklikt is ">
    public void kaartGeklikt() {
        if(!tweeKaartenOpen){
        if (gui.isMemoryCard1()) {
            kaarten[0].setActive();
            gui.MemoryKaart1.setIcon(kaarten[0].getIcon());
            gui.setMemoryCard1(false);
        }

        if (gui.isMemoryCard2()) {
            kaarten[1].setActive();
            gui.MemoryKaart2.setIcon(kaarten[1].getIcon());
            gui.setMemoryCard2(false);
        }
        if (gui.isMemoryCard3()) {
            kaarten[2].setActive();
            gui.MemoryKaart3.setIcon(kaarten[2].getIcon());
            gui.setMemoryCard3(false);
        }
        if (gui.isMemoryCard4()) {
            kaarten[3].setActive();
            gui.MemoryKaart4.setIcon(kaarten[3].getIcon());
            gui.setMemoryCard4(false);
        }
        if (gui.isMemoryCard5()) {
            kaarten[4].setActive();
            gui.MemoryKaart5.setIcon(kaarten[4].getIcon());
            gui.setMemoryCard5(false);
        }
        if (gui.isMemoryCard6()) {
            kaarten[5].setActive();
            gui.MemoryKaart6.setIcon(kaarten[5].getIcon());
            gui.setMemoryCard6(false);
        }
        if (gui.isMemoryCard7()) {
            kaarten[6].setActive();
            gui.MemoryKaart7.setIcon(kaarten[6].getIcon());
            gui.setMemoryCard7(false);
        }
        if (gui.isMemoryCard8()) {
            kaarten[7].setActive();
            gui.MemoryKaart8.setIcon(kaarten[7].getIcon());
            gui.setMemoryCard8(false);
        }
        if (gui.isMemoryCard9()) {
            kaarten[8].setActive();
            gui.MemoryKaart9.setIcon(kaarten[8].getIcon());
            gui.setMemoryCard9(false);
        }
        if (gui.isMemoryCard10()) {
            kaarten[9].setActive();
            gui.MemoryKaart10.setIcon(kaarten[9].getIcon());
            gui.setMemoryCard10(false);
        }
        if (gui.isMemoryCard11()) {
            kaarten[10].setActive();
            gui.MemoryKaart11.setIcon(kaarten[10].getIcon());
            gui.setMemoryCard11(false);
        }
        if (gui.isMemoryCard12()) {
            kaarten[11].setActive();
            gui.MemoryKaart12.setIcon(kaarten[11].getIcon());
            gui.setMemoryCard12(false);
        }
    }else{
        for(int i =0; i<kaarten.length; i++){
            kaarten[i].setInactive();
        }
        
        }
    }

// </editor-fold>

// <editor-fold defaultstate="collapsed" desc=" test of alle kaarten weg zijn ">
    public void alleKaartenWeg() {
        int counter = 0;
        
        for (int i = 0; i < kaarten.length; i++) {
            
            if (!kaarten[i].checkKaartBestaat()) {
                counter += 1;
                
            }
            
        }
        if (counter == kaarten.length) {
            this.mainNext=false;
            stopGame();
        }
    }

// </editor-fold>

// <editor-fold defaultstate="collapsed" desc=" Refresh Icons ">
    private void refreshIcons() {
        gui.MemoryKaart1.setIcon(kaarten[0].getIcon());
        gui.MemoryKaart2.setIcon(kaarten[1].getIcon());
        gui.MemoryKaart3.setIcon(kaarten[2].getIcon());
        gui.MemoryKaart4.setIcon(kaarten[3].getIcon());
        gui.MemoryKaart5.setIcon(kaarten[4].getIcon());
        gui.MemoryKaart6.setIcon(kaarten[5].getIcon());
        gui.MemoryKaart7.setIcon(kaarten[6].getIcon());
        gui.MemoryKaart8.setIcon(kaarten[7].getIcon());
        gui.MemoryKaart9.setIcon(kaarten[8].getIcon());
        gui.MemoryKaart10.setIcon(kaarten[9].getIcon());
        gui.MemoryKaart11.setIcon(kaarten[10].getIcon());
        gui.MemoryKaart12.setIcon(kaarten[11].getIcon());
        
        //zet de hovereffecten aan als de kaart bestaat. zet het hover effect uit als de kaart niet bestaat
        for(int i = 0; i<kaarten.length; i++){
            if(kaarten[i].checkKaartBestaat()){
                switch (i){
                    case 0: gui.setHoverEffect1(true); break;
                    case 1: gui.setHoverEffect2(true); break;
                    case 2: gui.setHoverEffect3(true); break;
                    case 3: gui.setHoverEffect4(true); break;
                    case 4: gui.setHoverEffect5(true); break;
                    case 5: gui.setHoverEffect6(true); break;
                    case 6: gui.setHoverEffect7(true); break;
                    case 7: gui.setHoverEffect8(true); break;
                    case 8: gui.setHoverEffect9(true); break;
                    case 9: gui.setHoverEffect10(true); break;
                    case 10:gui.setHoverEffect11(true); break;
                    case 11:gui.setHoverEffect12(true); break;
                }       
            }else{
                switch(i){
                    case 0: gui.setHoverEffect1(false); break;
                    case 1: gui.setHoverEffect2(false); break;
                    case 2: gui.setHoverEffect3(false); break;
                    case 3: gui.setHoverEffect4(false); break;
                    case 4: gui.setHoverEffect5(false); break;
                    case 5: gui.setHoverEffect6(false); break;
                    case 6: gui.setHoverEffect7(false); break;
                    case 7: gui.setHoverEffect8(false); break;
                    case 8: gui.setHoverEffect9(false); break;
                    case 9:gui.setHoverEffect10(false); break;
                    case 10:gui.setHoverEffect11(false); break;
                    case 11:gui.setHoverEffect12(false); break;
                }
            
            }
        }
    }
}

// </editor-fold>
